/**
 * facebook thrift通过一个中间语言IDL(接口定义语言)来定义RPC的数据类型和接口,这些内容写在以.thrift结尾的文件中,
 * 然后通过特殊的编译器来生成不同语言的代码,以满足不同需要的开发者,比如java开发者,就可以生成java代码,c++开发者可以生成c++代码,
 * 生成的代码中不但包含目标语言的接口定义,方法,数据类型,还包含有RPC协议层和传输层的实现代码.
 * 
 * thrift是一种c/s的架构体系.在最上层是用户自行实现的业务逻辑代码.第二层是由thrift编译器自动生成的代码，主要用于结构化数据的解析，发送和接收
 * 。TServer主要任务是高效的接受客户端请求，并将请求转发给Processor处理。Processor负责对客户端的请求做出响应，包括RPC请求转发，
 * 调用参数解析和用户逻辑调用，返回值写回等处理。从TProtocol以下部分是thirft的传输协议和底层I/O通信。TProtocol是用于数据类型解析的
 * ，将结构化数据转化为字节流给TTransport进行传输。TTransport是与底层数据传输密切相关的传输层，负责以字节流方式接收和发送消息体，
 * 不关注是什么数据类型。底层IO负责实际的数据传输，包括socket、文件和压缩数据流等。
 * 
 * 传输体系 传输协议
 * 
 * Thrift 支持多种传输协议，用户可以根据实际需求选择合适的类型。Thrift 传输协议上总体可划分为文本 (text) 和二进制 (binary)
 * 传输协议两大类，一般在生产环境中使用二进制类型的传输协议为多数（相对于文本和 JSON 具有更高的传输效率）。常用的协议包含：
 * 
 * TBinaryProtocol：是Thrift的默认协议，使用二进制编码格式进行数据传输，基本上直接发送原始数据
 * TCompactProtocol：压缩的、密集的数据传输协议，基于Variable-length quantity的zigzag 编码格式
 * TJSONProtocol：以JSON (JavaScript Object Notation)数据编码协议进行数据传输
 * TDebugProtocol：常常用以编码人员测试，以文本的形式展现方便阅读
 * 
 * 关于以上几种类型的传输协议，如果想更深入更具体的了解其实现及工作原理，可以参考站外相关文章《thrift源码研究》。
 *  
 * 传输方式与传输协议一样，Thrift 也支持几种不同的传输方式。
 * 1. TSocket：阻塞型 socket，用于客户端，采用系统函数 read 和 write进行读写数据。
 * 2. TServerSocket：非阻塞型 socket，用于服务器端，accecpt 到的 socket 类型都是TSocket（即阻塞型 socket）。 
 * 3. TBufferedTransport 和 TFramedTransport
 * 都是有缓存的，均继承TBufferBase，调用下一层 TTransport 类进行读写操作吗，结构极为相似。其中 TFramedTransport
 * 以帧为传输单位，帧结构为：4个字节（int32_t）+传输字节串，头4个字节是存储后面字节串的长度，该字节串才是正确需要传输的数据，因此
 * TFramedTransport 每传一帧要比 TBufferedTransport 和 TSocket 多传4个字节。
 * 4. TMemoryBuffer继承 TBufferBase，用于程序内部通信用，不涉及任何网络I/O，可用于三种模式：（1）OBSERVE模式，不可写数据到缓存；（2）
 * TAKE_OWNERSHIP模式，需负责释放缓存；（3）COPY模式，拷贝外面的内存块到TMemoryBuffer。
 * 5. TFileTransport 直接继承TTransport，用于写数据到文件。对事件的形式写数据，主线程负责将事件入列，写线程将事件入列，并将事件里的数据写入磁盘。这里面用到了两个队列，类型为
 * TFileTransportBuffer，一个用于主线程写事件，另一个用于写线程读事件，这就避免了线程竞争。在读完队列事件后，就会进行队列交换，
 * 由于由两个指针指向这两个队列，交换只要交换指针即可。它还支持以 chunk（块）的形式写数据到文件。
 * 6. TFDTransport 是非常简单地写数据到文件和从文件读数据，它的 write 和 read 函数都是直接调用系统函数 write 和 read 进行写和读文件。
 * 7.TSimpleFileTransport 直接继承 TFDTransport，没有添加任何成员函数和成员变量，不同的是构造函数的参数和在TSimpleFileTransport
 * 构造函数里对父类进行了初始化（打开指定文件并将fd传给父类和设置父类的close_policy为CLOSE_ON_DESTROY）。 
 * 8.TZlibTransport 跟 TBufferedTransport 和 TFramedTransport一样，调用下一层 TTransport
 * 类进行读写操作。它采用<zlib.h>提供的 zlib 压缩和解压缩库函数来进行压解缩，写时先压缩再调用底层 TTransport 类发送数据，读时先调用
 * TTransport 类接收数据再进行解压，最后供上层处理。
 * 9. TSSLSocket 继承 TSocket，阻塞型 socket，用于客户端。采用openssl 的接口进行读写数据。checkHandshake(）函数调用 SSL_set_fd 将 fd 和 ssl 绑定在一起，之后就可以通过
 * ssl 的 SSL_read和SSL_write 接口进行读写网络数据。 
 * 10. TSSLServerSocket 继承TServerSocket，非阻塞型 socket， 用于服务器端。accecpt 到的 socket 类型都是 TSSLSocket 类型。
 * 11. THttpClient 和 THttpServer 是基于 Http1.1 协议的继承 Transport 类型，均继承THttpTransport，其中 THttpClient 用于客户端，THttpServer 用于服务器端。两者都调用下一层 TTransport
 * 类进行读写操作，均用到TMemoryBuffer 作为读写缓存，只有调用 flush() 函数才会将真正调用网络 I/O 接口发送数据。
 * 
 * TTransport 是所有 Transport 类的父类，为上层提供了统一的接口而且通过 TTransport 即可访问各个子类不同实现，类似多态。
 * 
 * @author donald 2018年3月9日 上午9:00:58
 */
package org.thrift;